package com.collection.provider.config;

import java.sql.SQLException;

import javax.sql.DataSource;

import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

import com.alibaba.druid.pool.DruidDataSource;

@Configuration
@MapperScan("com.collection.provider.business.dao")
public class MyBatisConfig {

	private static final Logger logger = LoggerFactory.getLogger(MyBatisConfig.class);
	@Autowired
	private JdbcConfig jdbcConfig;

	@Bean
	public DataSource createDataSource() throws SQLException {
		
		logger.info("创建开始");
 
		DruidDataSource datasource = new DruidDataSource();  
        
        datasource.setUrl(jdbcConfig.getDbUrl());  
        datasource.setUsername(jdbcConfig.getUsername());  
        datasource.setPassword(jdbcConfig.getPassword());  
        datasource.setDriverClassName(jdbcConfig.getDriverClassName());  
          
        //configuration  
        datasource.setInitialSize(jdbcConfig.getInitialSize());  
        datasource.setMinIdle(jdbcConfig.getMinIdle());  
        datasource.setMaxActive(jdbcConfig.getMaxActive());  
        datasource.setMaxWait(jdbcConfig.getMaxWait());  
        datasource.setTimeBetweenEvictionRunsMillis(jdbcConfig.getTimeBetweenEvictionRunsMillis());  
        datasource.setMinEvictableIdleTimeMillis(jdbcConfig.getMinEvictableIdleTimeMillis());  
        datasource.setValidationQuery(jdbcConfig.getValidationQuery());  
        datasource.setTestWhileIdle(jdbcConfig.isTestWhileIdle());  
        datasource.setTestOnBorrow(jdbcConfig.isTestOnBorrow());  
        datasource.setTestOnReturn(jdbcConfig.isTestOnReturn());  
        datasource.setPoolPreparedStatements(jdbcConfig.isPoolPreparedStatements());  
        datasource.setMaxPoolPreparedStatementPerConnectionSize(jdbcConfig.getMaxPoolPreparedStatementPerConnectionSize());  
        try {  
            datasource.setFilters(jdbcConfig.getFilters());  
        } catch (SQLException e) {  
            logger.error("druid configuration initialization filter", e);  
        }  
        datasource.setConnectionProperties(jdbcConfig.getConnectionProperties());  
          
        return datasource;  
	}
	
	
	

	@PropertySource(value = "classpath:application-${spring.profiles.active}.properties")
	@Component
	static class JdbcConfig {
 
		
		
		@Value("${spring.datasource.url}")  
	    private String dbUrl;  
	      
	    @Value("${spring.datasource.username}")  
	    private String username;  
	      
	    @Value("${spring.datasource.password}")  
	    private String password;  
	      
	    @Value("${spring.datasource.driverClassName}")  
	    private String driverClassName;  
	      
	    @Value("${spring.datasource.initialSize}")  
	    private int initialSize;  
	      
	    @Value("${spring.datasource.minIdle}")  
	    private int minIdle;  
	      
	    @Value("${spring.datasource.maxActive}")  
	    private int maxActive;  
	      
	    @Value("${spring.datasource.maxWait}")  
	    private int maxWait;  
	      
	    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")  
	    private int timeBetweenEvictionRunsMillis;  
	      
	    @Value("${spring.datasource.minEvictableIdleTimeMillis}")  
	    private int minEvictableIdleTimeMillis;  
	      
	    @Value("${spring.datasource.validationQuery}")  
	    private String validationQuery;  
	      
	    @Value("${spring.datasource.testWhileIdle}")  
	    private boolean testWhileIdle;  
	      
	    @Value("${spring.datasource.testOnBorrow}")  
	    private boolean testOnBorrow;  
	      
	    @Value("${spring.datasource.testOnReturn}")  
	    private boolean testOnReturn;  
	      
	    @Value("${spring.datasource.poolPreparedStatements}")  
	    private boolean poolPreparedStatements;  
	      
	    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")  
	    private int maxPoolPreparedStatementPerConnectionSize;  
	      
	    @Value("${spring.datasource.filters}")  
	    private String filters;  
	      
	    @Value("{spring.datasource.connectionProperties}")  
	    private String connectionProperties;

        public String getDbUrl() {
            return dbUrl;
        }

        public void setDbUrl(String dbUrl) {
            this.dbUrl = dbUrl;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public String getDriverClassName() {
            return driverClassName;
        }

        public void setDriverClassName(String driverClassName) {
            this.driverClassName = driverClassName;
        }

        public int getInitialSize() {
            return initialSize;
        }

        public void setInitialSize(int initialSize) {
            this.initialSize = initialSize;
        }

        public int getMinIdle() {
            return minIdle;
        }

        public void setMinIdle(int minIdle) {
            this.minIdle = minIdle;
        }

        public int getMaxActive() {
            return maxActive;
        }

        public void setMaxActive(int maxActive) {
            this.maxActive = maxActive;
        }

        public int getMaxWait() {
            return maxWait;
        }

        public void setMaxWait(int maxWait) {
            this.maxWait = maxWait;
        }

        public int getTimeBetweenEvictionRunsMillis() {
            return timeBetweenEvictionRunsMillis;
        }

        public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
            this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
        }

        public int getMinEvictableIdleTimeMillis() {
            return minEvictableIdleTimeMillis;
        }

        public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
            this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
        }

        public String getValidationQuery() {
            return validationQuery;
        }

        public void setValidationQuery(String validationQuery) {
            this.validationQuery = validationQuery;
        }

        public boolean isTestWhileIdle() {
            return testWhileIdle;
        }

        public void setTestWhileIdle(boolean testWhileIdle) {
            this.testWhileIdle = testWhileIdle;
        }

        public boolean isTestOnBorrow() {
            return testOnBorrow;
        }

        public void setTestOnBorrow(boolean testOnBorrow) {
            this.testOnBorrow = testOnBorrow;
        }

        public boolean isTestOnReturn() {
            return testOnReturn;
        }

        public void setTestOnReturn(boolean testOnReturn) {
            this.testOnReturn = testOnReturn;
        }

        public boolean isPoolPreparedStatements() {
            return poolPreparedStatements;
        }

        public void setPoolPreparedStatements(boolean poolPreparedStatements) {
            this.poolPreparedStatements = poolPreparedStatements;
        }

        public int getMaxPoolPreparedStatementPerConnectionSize() {
            return maxPoolPreparedStatementPerConnectionSize;
        }

        public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
            this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
        }

        public String getFilters() {
            return filters;
        }

        public void setFilters(String filters) {
            this.filters = filters;
        }

        public String getConnectionProperties() {
            return connectionProperties;
        }

        public void setConnectionProperties(String connectionProperties) {
            this.connectionProperties = connectionProperties;
        }  

		 
	}
}
